
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>SpringBean的生命周期 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>SpringBean的生命周期 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring Bean 的生命周期主要包含哪五个核心阶段？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Bean的生命周期可以分为五个阶段：1. 实例化 (Instantiation)；2. 属性设置 (Populate Properties)；3. 初始化 (Initialization)；4. 使用 (In Use)；5. 销毁 (Destruction)。</div>
          </div>
          <div class="card-source">来源: 生命周期阶段</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Spring中，用于标记Bean初始化和销毁回调方法的注解分别是什么？它们各自在何时被调用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">初始化方法使用 @PostConstruct 注解，它在Bean实例化完成且属性注入之后被调用。销毁方法使用 @PreDestroy 注解，它在Bean被销毁之前被调用，用于执行资源释放或清理逻辑。</div>
          </div>
          <div class="card-source">来源: 生命周期回调方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Spring中默认的Bean作用域是什么？它与原型（Prototype）作用域在实例创建和管理上有何根本区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring中默认的作用域是单例（Singleton）。单例作用域确保在整个Spring容器中只存在一个Bean实例，由容器管理其完整生命周期。而原型（Prototype）作用域则表示每次请求时都会创建一个新的Bean实例，容器创建后不会对其进行管理和销毁。</div>
          </div>
          <div class="card-source">来源: Bean的作用域</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">BeanPostProcessor接口的作用是什么？它定义的两个核心方法分别在Bean生命周期的哪个环节执行？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">BeanPostProcessor接口允许在Bean实例化、依赖注入、初始化等阶段对Bean进行自定义处理。它定义了两个核心方法：postProcessBeforeInitialization方法在Bean的初始化方法调用之前执行；postProcessAfterInitialization方法在Bean的初始化方法调用之后执行。</div>
          </div>
          <div class="card-source">来源: BeanPostProcessor接口</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何使用注解来配置Spring Bean的延迟初始化？这种配置方式有什么优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用 @Lazy 注解将Bean的延迟初始化设置为true。其优势在于可以提高应用程序的性能，因为Bean不会在容器启动时立即创建，而是在首次被请求时才创建，这对于包含大量Bean或某些Bean仅在特定条件下使用的应用尤其有效。</div>
          </div>
          <div class="card-source">来源: Bean的延迟初始化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在实际应用中，利用Bean的生命周期回调机制可以实现哪些常见的资源管理操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">常见的资源管理操作包括：1. 初始化资源：在初始化阶段执行数据库连接、加载配置文件等操作。2. 销毁资源：在销毁阶段执行关闭数据库连接、释放文件句柄等清理操作，以确保资源被正确释放，避免内存泄漏。</div>
          </div>
          <div class="card-source">来源: Bean生命周期的应用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Spring Bean生命周期的“属性设置 (Populate Properties)”阶段，容器具体会执行什么操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在“属性设置”阶段，Spring容器会将Bean的属性值或依赖注入到Bean实例中。这可以通过构造函数注入、setter方法注入或字段注入等方式来实现。</div>
          </div>
          <div class="card-source">来源: 生命周期阶段</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么在使用单例（Singleton）作用域的Bean时，需要特别关注线程安全问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为单例Bean在整个Spring容器中只存在一个实例，它会被多个对象或线程共享。如果该Bean存在可变状态（如成员变量），在多线程环境下同时对其进行写操作就可能导致数据不一致，因此需要特别注意线程安全问题。</div>
          </div>
          <div class="card-source">来源: Bean的作用域</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">如果一个被@Configuration注解的类同时也被@Lazy注解标记，这会对该配置类中定义的Bean产生什么影响？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">如果一个@Configuration类被标记为@Lazy，那么该配置类中定义的所有Bean都将被自动配置为延迟初始化。这意味着这些Bean不会在容器启动时创建，而是在首次被应用程序请求时才会被实例化。</div>
          </div>
          <div class="card-source">来源: Bean的延迟初始化</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
